#pragma once

#include "Duplicate/Duplicate.h"
#include "Common/ActivityDefine.h"

//瘟疫之战副本
class PestilenceDuplicate : public Duplicate
{
public:
	////////////////////////////////  Duplicate  //////////////////////////////////////////
	//初始化
	virtual bool Init(uint32_t nDuplicateID, uint32_t nSceneID, IBrushMonster *pBrush);
	//
	virtual void UnInit();
	//是否能使用药物
	virtual bool CanUseItem() { return false; }; //瘟疫之战副本不能使用药物
	//获取瘟疫之战中 感染者和生还者数量
	virtual void GetPestilenceNum(int32_t &injectNum, int32_t &surviveNum);
	//获取瘟疫之战持续时间和变身ID
	virtual void GetPestilenceContiAndTransID(int32_t &contiSec, int32_t &injectTransId, int32_t &surviveTransId);
	//获取玩家阵营
	virtual int8_t GetDupCharCamp(CharIDType charId);
protected:
	virtual void OnReady_State();
	virtual void OnBegin_State();
	virtual void OnFinish_State();
	virtual void OnFlop_State();
	virtual void OnClean_State();
	virtual void OnDestory_State();
	//定时器更新
	virtual void OnTimerUpdate(uint32_t nTimerID);
	//执行事件
	virtual void OnExecuteEvent(uint16_t nEventID, uint32_t nSrcID, uint8_t bySrcType, void *pContext, int32_t nLen);
	//生物进入场景
	virtual void OnCreatureEnter(Creature *pCreature);
	//生物离开副本
	virtual void OnPlayerLeave(Player *pPlayer);
	//是否能进入
	virtual bool OnCanEnter(Creature *pCreature);
	//进入区域
	virtual bool OnEnterArea(uint32_t nAreaID);
	//复活
	virtual void OnRelive(Player *pPlayer, int8_t byType);
	//主动离开副本之前 的处理 
	virtual void OnActiveBeforeLeave(CharIDType cid);
	//主动离开副本失败 处理
	virtual void OnActiveLeaveFaild(CharIDType cid) {};
	//进入副本成功
	virtual void OnEnterSuccess(CharIDType charId);
private:
	void AddDown(CharIDType charId);	//添加倒地玩家
	void DelDown(CharIDType charId);	//删除倒地玩家
	bool IsDown(CharIDType charId);		//玩家是否处于倒地状态
	void CheckCharState();				//检查角色状态
	int32_t CampNum(int8_t camp);		//指定阵营的数量
	void GetCampChar(int8_t camp, SET_UINT64 &setChar);//获取阵营所有玩家
	int8_t CharCamp(CharIDType charId);	 //玩家阵营
	bool IsInjectCamp(CharIDType charId);//玩家是否是感染者阵营
	bool IsSurviveCamp(CharIDType charId);//玩家是否是生还者阵营
	void AddCharCamp(CharIDType charId,int8_t camp); //添加玩家阵营
	void DelCharCamp(CharIDType charId);	//删除玩家阵营
	void AddCharInject(CharIDType charId, int32_t nNum);//增加感染者 感染的数量
	int32_t GetInjectNum(CharIDType charId); //获取玩家把 生还者变成感染者的数量
	void SurviveBeInject(CharIDType charId);  //生还者被感染了
	void NotifyCampNum();					 //通知阵营成员数量变化
	void NotifyCharChangeCamp(CharIDType charId,int8_t camp); //通知角色阵营改变
	void CheckInitEnter();	//检查初始进入副本的玩家
public:
	explicit PestilenceDuplicate();
	virtual ~PestilenceDuplicate();
private:
	PestilenceCfg m_cfg;	//配置
	SET_UINT64 m_setDownChar;//倒地状态的玩家
	MAP_UINT64_INT8 m_mapCharCamp;//玩家阵营 1，生还者，2 感染者
	MAP_UINT64_INT32 m_mapCharInjectNum;//感染者 把生还者变成感染者的数量
	int32_t m_maxInjectNum;	//最大感染者数量（整个副本期间出现感染者最大数量）
	SET_UINT64 m_setInitEnter; //初始进入副本的玩家，主要是为了延迟一下调用效果
};